package Villanos;

import javax.swing.ImageIcon;

import Interfaz.RepresentacionGrafica;
import Juego.Casillero;
import Juego.Tablero;
import Heroes.Heroe;
import TDAMapeo.InvalidKeyException;

public class VillanoEspecial extends Villano {

	/**
	 * Constructor de la clase
	 * @param starPos posicion inicial en x
	 * @param altura posicion inicial en y
	 * @param fila fila en la que se encuentra
	 * @param t Tablero
	 */
	
	
	public VillanoEspecial(int starPos, int altura, int fila, Tablero t)
	{
		super("VillanoEspecial", 150,5,15,10,4,fila,t);
		try {
			component=new RepresentacionGrafica(getTablero().getMapeo().get(nombre),starPos,altura+90);
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.position=starPos;
		this.altura=altura+50;
		tieneHabilidad=true;
	}
	
	/**
	 * Permite al villano duplicarse cada vez que encuentra un heroe
	 */
	public void habilidad(Heroe h) {
		
		if ((h!= null)&& (position-h.getPosicion()<=80)){
			if (fila==0){
				Villano copia1= new VillanoEspecial(position,altura,fila+1,tablero);
				copia1.getRepresentacion().setVisible(true);
				copia1.setAltura(altura);
				tablero.getPanel().add(copia1.getRepresentacion());
				for (int i=0;i<20;i++)
				{
					copia1.getRepresentacion().setLocation(copia1.getPosicion(),copia1.getAltura()+120/20);
					copia1.setAltura(copia1.getAltura()+120/20);
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				
				copia1.start();
				copia1.setHabilidad(false);
				tablero.insertarVillano(copia1, 1);
			}
		else if (fila==4){
			Villano copia1= new VillanoEspecial(position,altura,fila-1,tablero);
			copia1.setAltura(this.getAltura());
			copia1.getRepresentacion().setVisible(true);
			tablero.getPanel().add(copia1.getRepresentacion());
			for (int i=0;i<20;i++)
			{
				copia1.getRepresentacion().setLocation(copia1.getPosicion(),copia1.getAltura()-120/20);
				copia1.setAltura(copia1.getAltura()-120/20);
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			copia1.start();
			copia1.setHabilidad(false);
			tablero.insertarVillano(copia1, 3);
		}
		else 
		{
			Villano copia1= new VillanoEspecial(position,altura,fila+1,tablero);
			copia1.getRepresentacion().setVisible(true);
			copia1.setAltura(altura);
			tablero.getPanel().add(copia1.getRepresentacion());
			Villano copia2= new VillanoEspecial(position,altura,fila-1,tablero);
			copia2.setAltura(this.getAltura());
			copia2.getRepresentacion().setVisible(true);
			tablero.getPanel().add(copia2.getRepresentacion());
			for (int i=0;i<20;i++)
			{
				copia1.getRepresentacion().setLocation(copia1.getPosicion(),copia1.getAltura()+120/20);
				copia1.setAltura(copia1.getAltura()+120/20);
				copia2.getRepresentacion().setLocation(copia2.getPosicion(),copia2.getAltura()-120/20);
				copia2.setAltura(copia2.getAltura()-120/20);
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			copia1.start();
			copia1.setHabilidad(false);
			tablero.insertarVillano(copia1, fila+1);
			copia2.start();
			copia2.setHabilidad(false);
			tablero.insertarVillano(copia2, fila-1);
		}
			tieneHabilidad=false;}
				
		}
			
	


	@Override
	/**
	 * Permite al villano atacar al heroe
	 */
	protected void atacar(Casillero h) {
		component.setAtacando();
		while ((vida>0) && h.getEstaOcupado() && h.getHeroe().getVida()>0  && tablero.getVida()>0 )
		{	
			
			atacarHeroe(h.getHeroe());
			try {
				Thread.sleep(5000/velocidad);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if ((h.getHeroe()!=null) && (h.getHeroe().getVida()<=0)){
			
			h.getHeroe().eliminar();
	}	
			component.setComun();
			component.setLocation(position,altura);
	}
}



